#ifndef HPDB_H
#define	HPDB_H

#include "CNodo.h"
#include "Heuristica.h"

class HPDB : public Heuristica {
public:
    
    /**
     * Crea una Base de Datos de patrones aditiva, donde las abstracciones son
     * indicadas por el parametro Conjuntos.
     * @param Conjuntos - Es un arreglo que indica que ficha va a cual 
     * abstraccion, si en la posicion i-esima esta el numero j, entonces la
     * ficha i va a la abstraccion j, excepto el vacio que esta incluido en
     * todas las abstracciones.
     * @param dimenciones - El ancho o alto del Casillero.
     */
    HPDB(const char *Conjuntos, int dimenciones);
    virtual ~HPDB();
    
    /**
     * Retorna el arreglo de abstracciones usadas para generar la PDB.
     */
    const char *Conjuntos() const;
    
    virtual int h(CNodo* estado);
    
    /**
     * Imprimie los tableros abstraidos de la PDB.
     */
    void print() const;

private:

    class TablaHash {
    public:
        unsigned char *valores;
        int largo;
        char *mascara;
        int concretas;

        virtual ~TablaHash();
    };

    TablaHash **tablas;
    int numeroDeTablas;

    char *conjuntos;
    int dimenciones;

    void dijistra_PDB(TablaHash *tabla);

    int HashPerfecto(const CNodo *s, const char *abst, int conc) const;

};

#endif	/* HPDB_H */
